home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / GraphicViewers / ViewGif2 / Source / FileQueue.m < prev    next >
Text File  |  1990-02-07  |  10KB  |  294 lines

  1. /*****************************************************************************/
  2. // FileQueue.m
  3. // implementation file of FileQueue class of ViewGif2 application
  4. // January 1990  Carl F. Sutter
  5. // FileQueue is a generic IB module that keeps a queue of strings that can be
  6. // returned on demand by a controlling object.  It can display a panel
  7. // that lets the user control the order etc. of the queue.  Most of the
  8. // controls are set up in the IB, making customization easy.
  9. /*****************************************************************************/
  10.  
  11. #import "FileQueue.h"
  12. #import <appkit/Application.h>
  13. #import <appkit/Window.h>
  14. #import <appkit/TextField.h>
  15. #import <appkit/Matrix.h>
  16. #import <appkit/publicWraps.h>        // for NXBeep
  17. #import <sys/param.h>            // for MAXPATHLEN
  18. #import <string.h>            // for strcpy
  19.  
  20. @implementation FileQueue
  21.  
  22. /*****************************************************************************/
  23. /* new - factory method                                 */
  24. /*****************************************************************************/
  25. + new
  26.    {
  27.    self = [super new];
  28.    [self setup];
  29.    return( self );
  30.    } /* new 1/22/90 CFS */
  31.  
  32.  
  33. /*****************************************************************************/
  34. /* new - factory method    with target and action                     */
  35. /*****************************************************************************/
  36. + new:(id )targ action:(SEL )act 
  37.    {
  38.    self = [super new];
  39.    [self setup];
  40.    target = targ;
  41.    action = act;
  42.    return( self );
  43.    } /* new:action: 1/23/90 CFS */
  44.   
  45.  
  46. /*****************************************************************************/
  47. /* setup - initialize instance variables and panel etc.               */
  48. /*****************************************************************************/
  49. - setup
  50.    {
  51.    NXSize    nxsList;
  52.    NXSize    nxsCell;
  53.    
  54.    /* load nib defining panel and outlets */
  55.    [NXApp loadNibSection:"FileQueue.nib" owner:self];
  56.  
  57.    /* set attributes for the scrollview and matrix */
  58.    [queueScroll setVertScrollerRequired:YES];
  59.    [queueScroll setBorderType:NX_BEZEL];
  60.    [queueScroll getContentSize:&nxsList];
  61.    [queueMatrix getCellSize:&nxsCell];
  62.    nxsCell.width = nxsList.width;
  63.    [queueMatrix setCellSize:&nxsCell];
  64.    [queueMatrix setAutoscroll:YES];
  65.    
  66.    /* attach the matrix to the scrollview */
  67.    [queueScroll setDocView:queueMatrix];
  68.    
  69.    /* remove any matrix cells drawn in the IB */
  70.    while ([queueMatrix cellCount]) [queueMatrix removeRowAt:0 andFree:YES];
  71.    [queueMatrix sizeToCells];
  72.    
  73.    /* init instance variables */
  74.    nNumRows = 0;
  75.    bPaused = NO;
  76.    bSendWhenReady = NO;
  77.    
  78.    return( self );
  79.    } /* setup 1/23/90 CFS */
  80.   
  81.  
  82. /*****************************************************************************/
  83. /* outlet initialization methods                            */
  84. /*****************************************************************************/
  85. - setQueuePanel:anObject   { queuePanel  = anObject;  return( self ); }
  86. - setQueueScroll:anObject  { queueScroll = anObject;  return( self ); }
  87. - setQueueMatrix:anObject  { queueMatrix = anObject;  return( self ); }
  88.  
  89.  
  90. /***************************************************************************/
  91. /* windowWillResize - Delegate message sent from main window.           */
  92. /* Prevent window from getting too small.                   */
  93. /***************************************************************************/
  94. - windowWillResize:sender toSize:(NXSize *)frameSize
  95.    {
  96.    /* minimum size to allow for the buttons and a small scrollview */
  97.    frameSize->width  = MAX( 250, frameSize->width );
  98.    frameSize->height = MAX( 150, frameSize->height );
  99.    return( self );
  100.    } /* windowWillResize 9/14/89 CFS */
  101.    
  102.  
  103. /*****************************************************************************/
  104. /* show - display the queue panel                         */
  105. /*****************************************************************************/
  106. - show:sender
  107.    {
  108.    [queuePanel makeKeyAndOrderFront:self];
  109.    return( self );
  110.    } /* show 1/22/90 CFS */
  111.  
  112.    
  113. /*****************************************************************************/
  114. /* pause - pause the queue                             */
  115. /*****************************************************************************/
  116. - pause:sender
  117.    {
  118.    bPaused = !bPaused;
  119.    if (!bPaused && bSendWhenReady) [self sendNext];
  120.    return( self );
  121.    } /* pause 1/22/90 CFS */
  122.  
  123.  
  124. /*****************************************************************************/
  125. /* remove - remove highlighted cells                            */
  126. /*****************************************************************************/
  127. - remove:sender
  128.    {
  129.    int  i;
  130.  
  131.    /* enumerate the highlighted cells */
  132.    nNumSelected = 0;
  133.    [queueMatrix sendAction:@selector(countOneSelected:) to:self forAllCells:NO];
  134.    /* delete the selected cells */
  135.    for (i=0; i<nNumSelected; i++)
  136.       {
  137.       [queueMatrix removeRowAt:(nSelectedRows[i]-i) andFree:YES];
  138.       nNumRows--;
  139.       }
  140.    [queueMatrix sizeToCells];
  141.    [queueScroll display];
  142.    return( self );
  143.    } /* remove 1/18/90 CFS */
  144.  
  145.  
  146. /*****************************************************************************/
  147. /* toTop - move selected cells to the top of the queue                 */
  148. /*****************************************************************************/
  149. - toTop:sender
  150.    {
  151.    int  nRealRow, i;
  152.    
  153.    /* enumerate the highlighted cells */
  154.    nNumSelected = 0;
  155.    [queueMatrix sendAction:@selector(countOneSelected:) to:self forAllCells:NO];
  156.    /* move the selected cells to the top */
  157.    for (i=nNumSelected-1; i>=0; i--)
  158.       {
  159.       [queueMatrix insertRowAt:0];
  160.       nRealRow = nSelectedRows[i] + nNumSelected - i;
  161.       [[queueMatrix cellAt:0 :0] setStringValue:
  162.          [[queueMatrix cellAt:nRealRow :0] stringValue]];
  163.       [queueMatrix removeRowAt:nRealRow andFree:YES];
  164.       }
  165.    [queueMatrix sizeToCells];
  166.    [queueScroll display];
  167.    return( self );
  168.    } /* toTop 1/18/90 CFS */
  169.  
  170.  
  171. /*****************************************************************************/
  172. /* toBottom - move selected cells to the bottom of the queue             */
  173. /*****************************************************************************/
  174. - toBottom:sender
  175.    {
  176.    int  nRealRow, i;
  177.    
  178.    /* enumerate the highlighted cells */
  179.    nNumSelected = 0;
  180.    [queueMatrix sendAction:@selector(countOneSelected:) to:self forAllCells:NO];
  181.    /* move the selected cells to the bottom */
  182.    for (i=0; i<nNumSelected; i++)
  183.       {
  184.       [queueMatrix addRow];
  185.       nRealRow = nSelectedRows[i] - i;
  186.       [[queueMatrix cellAt:nNumRows :0] setStringValue:
  187.          [[queueMatrix cellAt:nRealRow :0] stringValue]];
  188.       [queueMatrix removeRowAt:nRealRow andFree:YES];
  189.       }
  190.    [queueMatrix sizeToCells];
  191.    [queueScroll display];
  192.    return( self );
  193.    } /* toBottom 1/18/90 CFS */
  194.  
  195.  
  196. /*****************************************************************************/
  197. /* countOneSelected - enumerates one cell, adds row to the selected list     */
  198. /*****************************************************************************/
  199. - (BOOL)countOneSelected:cell
  200.    {
  201.    int    nRow, nCol;
  202.    
  203.    [queueMatrix getRow:&nRow andCol:&nCol ofCell:cell];
  204.    nSelectedRows[nNumSelected] = nRow;
  205.    nNumSelected++;
  206.    if (nNumSelected == MAXSELECTABLE) return( NO );
  207.    return( YES );  // to continue to next highlighted cell
  208.    } /* countOneSelected 1/18/90 CFS */
  209.    
  210.  
  211. /*****************************************************************************/
  212. /* setTarget - sets the object to return queue items to              */
  213. /*****************************************************************************/
  214. - setTarget:(id)targ
  215.    {
  216.    target = targ;
  217.    return( self );
  218.    } /* setTarget 1/22/90 CFS */
  219.  
  220.  
  221. /*****************************************************************************/
  222. /* setAction - sets the method that will be called with the new item        */
  223. /* there will be one parameter - a pointer to a standard C string         */
  224. /*****************************************************************************/
  225. - setAction:(SEL)aSelector
  226.    {
  227.    action = aSelector;
  228.    return( self );
  229.    } /* setAction 1/22/90 CFS */
  230.  
  231.  
  232. /*****************************************************************************/
  233. /* addItem - adds one string to the bottom of the queue                 */
  234. /*****************************************************************************/
  235. - (BOOL)addItem:(const char *)szFileName
  236.    {
  237.    [queueMatrix addRow];
  238.    [queueMatrix sizeToCells];
  239.    [[queueMatrix cellAt:nNumRows :0] setStringValue:szFileName];
  240.    [queueScroll display];
  241.    nNumRows++;
  242.    if (!bPaused && bSendWhenReady) [self sendNext];
  243.    return( YES );
  244.    } /* addItem 1/22/90 CFS */
  245.  
  246.  
  247. /*****************************************************************************/
  248. /* retrieveNext - immediately return the next string on the queue         */
  249. /* disregards the pause button - use retrieveNextWhenReady for that function */
  250. /*****************************************************************************/
  251. - (char *)retrieveNext
  252.    {
  253.    char szReturn[MAXPATHLEN + 1];
  254.    
  255.    if (nNumRows == 0) return( NULL );
  256.    strcpy( szReturn , [[queueMatrix cellAt:0 :0] stringValue] );
  257.    [queueMatrix removeRowAt:0 andFree:YES];
  258.    [queueMatrix sizeToCells];
  259.    [queueScroll display];
  260.    nNumRows--;
  261.    return( szReturn );
  262.    } /* retrieveNext 1/22/90 CFS */
  263.    
  264.    
  265. /*****************************************************************************/
  266. /* retrieveNextWhenReady - send the next queue item when it is available     */
  267. /*****************************************************************************/
  268. - retrieveNextWhenReady
  269.    {
  270.    bSendWhenReady = YES;
  271.    if (!bPaused) [self sendNext];
  272.    return( self );
  273.    } /* retrieveNextWhenReady 1/22/90 CFS */
  274.    
  275.    
  276. /*****************************************************************************/
  277. /* sendNext - send the next queue item to the target object             */
  278. /*****************************************************************************/
  279. - sendNext
  280.    {
  281.    char szReturn[MAXPATHLEN + 1];
  282.    
  283.    if (nNumRows > 0)
  284.       {
  285.       strcpy( szReturn, [self retrieveNext] );
  286.       [target perform:action with:(id)szReturn];
  287.       bSendWhenReady = NO;
  288.       }
  289.    return( self );
  290.    } /* sendNext 1/22/90 CFS */
  291.  
  292.  
  293. @end
  294.